package cn.example.demo.modules.house.service.impl;

import cn.example.demo.common.model.service.ServiceResult;
import cn.example.demo.common.retrieval.PageBean;
import cn.example.demo.common.secure.context.LoginUserApi;
import cn.example.demo.common.tools.QueryServiceUtils;
import cn.example.demo.common.tools.obj.reflect.EntityUtils;
import cn.example.demo.modules.house.dto.SysConfigDto;
import cn.example.demo.modules.house.entity.SysConfig;
import cn.example.demo.modules.house.mapper.SysConfigMapper;
import cn.example.demo.modules.house.service.ISysConfigService;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 描述：【系统参数】接口实现类
 */

@Service
public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig> implements ISysConfigService {
    @Autowired
    private LoginUserApi loginUserApi;
    @Resource(name = "dictCache")
    private Cache<String, Object> dictCache;

    @Transactional(rollbackFor = Exception.class)
    @Override
    public ServiceResult insertSysConfig(SysConfigDto sysConfigDto) {
        SysConfig entity = EntityUtils.entityConvert(sysConfigDto, new SysConfig(), false);
        if (this.save(entity)) {
            // 配置信息更新到本地缓存
            dictCache.put(entity.getParamKey(), entity.getParamValue());
            return ServiceResult.isSuccess(StrUtil.format("【系统参数，ID:{}】创建成功!", entity.getId()), entity);
        }
        return ServiceResult.isInternalError("【系统参数】创建失败，未知错误！");
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public ServiceResult updateSysConfig(SysConfigDto sysConfigDto) {
        SysConfig entity = this.getById(sysConfigDto.getId());
        if (entity == null) {
            return ServiceResult.isNotFound(StrUtil.format("【系统参数】信息更新失败：记录不存在！ID:{}", sysConfigDto.getId()));
        }
        entity = EntityUtils.entityConvert(sysConfigDto, entity, true);
        if (this.updateById(entity)) {
            // 配置信息更新到本地缓存
            dictCache.put(entity.getParamKey(), entity.getParamValue());
            return ServiceResult.isSuccess(StrUtil.format("【系统参数，ID:{}】信息更新成功!", entity.getId()), null);
        }
        return ServiceResult.isNotModified("未知错误，【系统参数】信息修改失败！");
    }

    @Override
    public PageBean querySysConfig(SysConfigDto sysConfigDto) {
        Page pageResult = PageHelper.startPage(sysConfigDto.getPageNum(), sysConfigDto.getPageSize())
                .doSelectPage(() -> this.list(getQueryWrapper(sysConfigDto)));

        return QueryServiceUtils.encapsulatePageBean(new PageBean<>(), pageResult);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public ServiceResult deleteSysConfig(SysConfigDto sysConfigDto) {
        // 查询待删除的配置信息项
        List<String> paramKeys = this.baseMapper.selectBatchIds(sysConfigDto.getIds()).stream().map(SysConfig::getParamKey).collect(Collectors.toList());
        int rows = this.baseMapper.deleteBatchIds(sysConfigDto.getIds());
        if (rows > 0) {
            // 本地缓存失效配置信息项
            dictCache.invalidateAll(paramKeys);
            return ServiceResult.isSuccess(StrUtil.format("操作成功，已批量删除【系统参数】共 {} 条记录！", rows), rows);
        }

        return ServiceResult.isNotModified("删除【系统参数】失败，请稍后重试！");
    }

    @Override
    public SysConfig findSysConfigById(String id) {
        return this.getById(id);
    }

    @Override
    public List<Map<String, Object>> querySysConfigAsDict(SysConfigDto sysConfigDto) {
        return this.baseMapper.selectAsDictList(getQueryWrapper(sysConfigDto));
    }

    /**
     * 查询条件
     *
     * @param sysConfigDto
     * @return
     */

    protected LambdaQueryWrapper getQueryWrapper(SysConfigDto sysConfigDto) {
        LambdaQueryWrapper<SysConfig> wrapper = Wrappers.lambdaQuery();

        wrapper
                .eq(StrUtil.isNotBlank(sysConfigDto.getId()), SysConfig::getId, sysConfigDto.getId())

                .like(StrUtil.isNotBlank(sysConfigDto.getParamName()), SysConfig::getParamName, sysConfigDto.getParamName())

                .like(StrUtil.isNotBlank(sysConfigDto.getParamKey()), SysConfig::getParamKey, sysConfigDto.getParamKey())

                .like(StrUtil.isNotBlank(sysConfigDto.getParamValue()), SysConfig::getParamValue, sysConfigDto.getParamValue())

                .eq(sysConfigDto.getConfigStatus() != null, SysConfig::getConfigStatus, sysConfigDto.getConfigStatus())
        ;

        return wrapper;
    }
}
